Майнор "Интеллектуальный анализ данных"

Курс "Введение в программирование"

Визуализация и первичный анализ данных

Table of contents

  1. Links
  2. Визуализация в Python
    1. Визуализация динамики
    2. Распределение дискретных признаков
    3. Распределение непрерывных признаков
      1. Гистограмма
      2. Boxplot
    4. Визуализация зависимости
      1. Scatterplot
      2. Heatmap
    5. Несколько графиков на одном
    6. Сохранение изображения
    7. Подписи осей

Визуализация в Python

Сначала выполним все необходимые настройки и подключим библиотеки.
Для визуализации мы будем использовать:

Будем практиковаться на наборе данных о продажах и оценках видеоигр: Kaggle Dataset.

Описание с источника:
Alongside the fields: Name, Platform, Year_of_Release, Genre, Publisher, NA_Sales, EU_Sales, JP_Sales, Other_Sales, Global_Sales, we have:

Загрузим данные, определим размерность и посмотрим на сами данные

Первое, что бросается в глаза - пропуски в данных (NaN в ячейках).
Видно, что пропуски присутствуют в половине признаков. Для простоты удалим такие наблюдения.

Объем данных заметно уменьшился.
Теперь посмотрим на количество уникальных игр в датасете.
Спойлер: их заметно меньше, чем число наблюдений. Сразу найдем все игры, которые встречаются более одного раза, и посмотрим на одну из них в качестве примера.

Судя по данным, одна и та же игра может быть представлена на различных платформах, и также могут быть перезапуски (более поздний год).

Поменяем типы некоторых признаков перед основной работой, т.к. при чтении они были определены неверно с нашей точки зрения.

Визуализация динамики

Для визуализации динамики лучше всего подходит стандартный lineplot.
Метод plot() в Pandas строит график для каждого столбца, разделяя их по цветам, и добавляет легенду. Удобно.

Если признаков много, на одном графике они могут смешаться в кучу и получится spaghetti plot, на котором очень сложно что-то увидеть. В таких случаях имеет смысл отобразить каждый признак на отдельном подграфе.

Задание

Постройте график или несколько, показывающий число игр, выпущенных в каждый год в общем и с разбивкой:

    - по жанру
    - по возрастному рейтингу

Задание

Провизуализируйте динамику по годам средней оценки пользователей в общем и с разбивкой:

    - по жанру
    - по возрастному рейтингу

Распределение дискретных признаков

Для визуализации распределения категориальных признаков хорошо подходит barplot. По сути, для каждой категории он строит столбик (bar) высотой равной количеству наблюдений, в которых это значение встретилось.

Вместо bar'ов можно построить lollipop plot.

Популярной альтернативой barplot является pieplot. Однако этот тип графика скорее вреден, т.к. он искажает представление о соотношении долей категорий (так говорят). В данном случае еще и цвета у категорий совпадают.

Можно немного модифицировать график, превратив его в doughnut plot. Стало немного лучше, но кардинально ничего не изменилось.

В общем, посыл такой - не использовать pieplot и его вариации.

Очень удобное свойство barplot - на графике можно посмотреть распределение сразу по нескольким признакам. Ниже в примере показаны продажи для каждого жанра.

В таком виде анализировать график тяжело. Как и в случае с lineplot, удобнее разбить его на несколько графиков.
В таком виде информация представлена нагляднее. Например, можно сразу заметить, что продажи по жанрам распределены примерно одинаково везде, кроме Японии - там проявляют особый интерес к RPG и не любят шутеры.

С помощью метода transpose() можно транспонировать датафрейм, т.е. поменять местами оси.

Для построения barplot мы использовали посчитанные значения для каждой категории. Фактически, мы передавали методу plot() индексированный массив.

Функции countplot() и factorplot() из библиотеки seaborn позволяют передавать им обычный набор данных, и берут на себя подсчет числа наблюдений для каждой категории.
Для примера посмотрим на число наблюдений с пропущенными значениями в зависимости от жанра или платформы.

По умолчанию категории упорядочены по тому, какая раньше встретилась в наборе данных. Порядок можно поменять с помощью аргумента order.
Можно, например, отсортировать в лексикографическом порядке.

Или в случайном порядке:

Или по убыванию величины категории. Но использовать для этого countplot не всегда разумно, т.к. все равно приходится вызывать value_counts().

Задание

Постройте график или несколько, показывающий число игр, выпущенных в каждый год в общем и с разбивкой:

    - по жанру
    - по возрастному рейтингу

Выполните задание, используя barplot.

Распределение непрерывных признаков

Гистограмма

Гистограмма позволяет оценить распределение непрерывной величины, разбивая интервал значений на несколько интервалов и считая, сколько наблюдений попало в каждый из интервалов, аналогично bar plot.
Для правильной оценки распределения важно выбрать число интервалов (они, как правило, равны). Чаще всего по умолчанию используют число интервалов равное $\sqrt{x_{max}}$, где $x_{max}$ - наибольшее наблюдаемое значение.

Можно построить гистрограмму признака с разбивкой по группам, что позволит оценить распределение признака в каждой группе и сравнить между собой. Но т.к. границы значений наблюдений в каждой группе могут отличаться, гистограммы также будут построены с разными параметрами - числом столбцов и их шириной.

Можно явно задать число столбцов в гистограмме (bins). Тем не менее, они будут по-прежнему отличаться шириной.

Также можно арументу bins вместо числа столбцов передать сами интервалы - массив из n+1 значений, где n - число интервалов. При этом, интервалы могут быть разного размера.
В таком случае гистограммы для разных групп будут синхронизированы.

Гистограммы позволяют оценить распределение в целом, сделать выводы о принаджлежности распределения к одному из известных, и заметить отклонения. Например, на графиках распределения напоминают нормальное, но средние значения сильно смещены вправо, при этом распределения имеют длинные левые хвосты.

Задание

Постройте гистрограмму числа пользователей.
Также постройте с разбивкой по возрастному рейтингу. Используйте одни и те же интервалы в каждой из гистограмм.

Boxplot

Для более детальной оценки и визуализации статистик распределения непрерывных величин принято использовать boxplot.

Ящик содержит в себе половину наблюдений - от 0.25 персентиля до 0.75 персентиля. Черта посередине - медиана. Границы "усов" определяются по формуле на изображении ниже. Все, что выходит за эти ганицы, считается выбросами и отображается отдельными точками. Изображение ниже демонстрируем boxplot для нормального распределения.

title

Так можно загрузить и вывести изображение в python

from scipy import misc
from matplotlib import cm
image = misc.imread('boxplot.png')
plt.figure(figsize = (15,10))
plt.imshow(image, cmap=cm.binary)

Ниже представлены боксплоты для оценок критиков с разбивкой по жанрам (аналогично гистограммам).
Можно сказать, что оценки у спортивных игр в среднем выше остальных жанров, и распределены более плотно. Хуже всего с оценками у приключенческих игр.

При построении боксплотов мы хорошо визуализируем статистики, но теряем информацию о количестве наблюдений, на которых эти статистики оценивались. Для устранения этого недостатка можно воспользоваться способом, представленным ниже. Также для этого есть модифицированный боксплот - violin plot.

Задание

С помощью boxplot оцените распределение оценок пользователей для 7 самых популярных (больше всего пользователей) издателей (publisher).

Визуализация зависимости

Scatter plot

Диаграмма рассеяния, по сути, визуализирует наблюдения в пространстве двух признаков. На основе распределения точек на графике можно сделать вывод, например, о зависимости признаков.

На график можно добавить информацию о третьем признаке, например, через размер точек.

Или через цвет.

Warning: ниже тяжелый график, может долго отрисовываться и съесть много ресурсов.

Heatmap

Тепловые карты просто раскрашивают матрицу числовых значений, используя цветовую шкалу, построенную на основе значений в матрице. Так очень удобно оценивать корреляции между признаками.

Также можно привизуализировать и сводные таблицы.

Несколько графиков на одном

Просто демонстрация возможностей.

Сохранение изображения

Подписи осей

На многих графиках выше одна из осей или даже обе оставались без подписей. В таком случае сложно понять, что именно изображено на графике. Не надо так.
Подписи можно задать с помощью функций xlabel и ylabel.